package ar.com.hakasoft


import ar.com.hakasoft.entities.Cliente
import ar.com.hakasoft.entities.Egreso
import ar.com.hakasoft.entities.Factura

import org.springframework.transaction.annotation.Transactional

class ReportesService {

    static transactional = false

	@Transactional(readOnly = true)
	def getReporteFacturacionMesActual(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir){
				
		def listaFacturas = Factura.createCriteria().list(){
				
			if (vendedorSeleccionado){
				eq ("vendedor.id", vendedorSeleccionado)
			}
			
			Calendar calendarMinimo = Calendar.getInstance()
			Calendar calendarMaximo = Calendar.getInstance()
			
			if (fecha){
				def fechaParseada = fecha.split()
				calendarMinimo.set(fechaParseada[2].toInteger(), fechaParseada[1].toInteger()-1, fechaParseada[0].toInteger(), 0, 0, 0)
				calendarMaximo.set(fechaParseada[2].toInteger(), fechaParseada[1].toInteger()-1, fechaParseada[0].toInteger(), 23, 59, 59)
			}else{
				
				if(anioSeleccionado && mesSeleccionado && !anioSeleccionado.equals("null") && !mesSeleccionado.equals("null")){
					if (!mesSeleccionado.equals("null")){
						calendarMinimo.set(anioSeleccionado, mesSeleccionado, 1, 0, 0, 0)
						calendarMaximo.set(anioSeleccionado, mesSeleccionado, calendarMinimo.getActualMaximum(calendarMinimo.DATE), 23, 59, 59)
					}else{
						calendarMinimo.set(anioSeleccionado, calendarMinimo.JANUARY, 1, 0, 0, 0)
						calendarMaximo.set(anioSeleccionado, calendarMinimo.DECEMBER, 31, 23, 59, 59)
					}
				}else{
					calendarMinimo.set(2011, 0, calendarMinimo.getActualMinimum(1), 0, 0, 0)
					calendarMaximo.set(calendarMaximo.get(Calendar.YEAR), calendarMaximo.get(Calendar.MONTH) + 1,calendarMaximo.get(Calendar.DATE), 23, 59, 59 )
				}
			}
			or{
				between("fecha",calendarMinimo.getTime(), calendarMaximo.getTime())
				if (imprimir){
					between("fechaPagada",calendarMinimo.getTime(), calendarMaximo.getTime())
				}
			}
			
			eq("fueEliminada", false)
//			if (!imprimir){
//				eq("fueCobrada", true)
//			}
			order("fecha","asc")
		}
		listaFacturas
	}
	
	@Transactional(readOnly = true)
	def getReporteEgreso(anioSeleccionado, mesSeleccionado, fecha){
		
		return Egreso.createCriteria().list(){
				
			Calendar calendarMinimo = Calendar.getInstance()
			Calendar calendarMaximo = Calendar.getInstance()
			
			if (fecha){
				def fechaParseada = fecha.split()
				calendarMinimo.set(fechaParseada[2].toInteger(), fechaParseada[1].toInteger()-1, fechaParseada[0].toInteger(), 0, 0, 0)
				calendarMaximo.set(fechaParseada[2].toInteger(), fechaParseada[1].toInteger()-1, fechaParseada[0].toInteger(), 23, 59, 59)
			}else{
				if(anioSeleccionado && mesSeleccionado && !anioSeleccionado.equals("null") && !mesSeleccionado.equals("null")){
					if (!mesSeleccionado.equals("null")){
						calendarMinimo.set(anioSeleccionado, mesSeleccionado, 1, 0, 0, 0)
						calendarMaximo.set(anioSeleccionado, mesSeleccionado, calendarMinimo.getActualMaximum(calendarMinimo.DATE), 23, 59, 59)
					}else{
						calendarMinimo.set(anioSeleccionado, calendarMinimo.JANUARY, 1, 0, 0, 0)
						calendarMaximo.set(anioSeleccionado, calendarMinimo.DECEMBER, 31, 23, 59, 59)
					}
				}else{
					calendarMinimo.set(2011, 0, calendarMinimo.getActualMinimum(1), 0, 0, 0)
					calendarMaximo.set(calendarMaximo.get(Calendar.YEAR), calendarMaximo.get(Calendar.MONTH) + 1,calendarMaximo.get(Calendar.DATE), 23, 59, 59 )
				}
			}
			
			between("fecha",calendarMinimo.getTime(), calendarMaximo.getTime())
			
			eq("fueEliminada", false)
			order("fecha","asc")
		}
	}
	
	@Transactional(readOnly = true)
	def getEstadistica(vendedor, dietetica, cliente, anio, mes){
		def estadisticas = Factura.createCriteria().list(){
				
			if (vendedor){
				eq ("vendedor.id", vendedor)
			}
			if (dietetica){
				eq ("dietetica.id", dietetica)
			}
			if (cliente){
				eq ("cliente.id", cliente)
			}
			
			Calendar calendarMinimo = Calendar.getInstance()
			Calendar calendarMaximo = Calendar.getInstance()
			
			if(!anio.equals("null")){
				if (!mes.equals("null")){
					calendarMinimo.set(anio, mes, 1, 0, 0, 0)
					calendarMaximo.set(anio, mes, calendarMinimo.getActualMaximum(calendarMinimo.DATE), 23, 59, 59)
				}else{
					calendarMinimo.set(anio, calendarMinimo.JANUARY, 1, 0, 0, 0)
					calendarMaximo.set(anio, calendarMinimo.DECEMBER, 31, 23, 59, 59)
				}
			}else{
				calendarMinimo.set(2011, 0, calendarMinimo.getActualMinimum(1), 0, 0, 0)
				calendarMaximo.set(calendarMaximo.get(Calendar.YEAR), calendarMaximo.get(Calendar.MONTH) + 1,calendarMaximo.get(Calendar.DATE), 23, 59, 59 )
			}
				
			between("fecha",calendarMinimo.getTime(), calendarMaximo.getTime())
			
			eq("fueEliminada", false)
			eq("fueCobrada", true)
			order("fecha","asc")
			order("vendedor","asc")
			order("dietetica","asc")
		}
		
		return [estadisticas:estadisticas, total:estadisticas.precioTotal.sum()]
		
	}
	
}
